#pragma once

#ifdef WIN32
#include "pthread.h"
#else
#include <pthread.h>
#endif

namespace Core
{
	/**
	 * kelas untuk menciptakan thread
	 */
	class Thread
	{
	private:
		pthread_t m_ThreadDescriptor; ///deksriptor dari thread
		pthread_attr_t m_Attribute; ///atrribut dari suatu thread
	
	public:
		Thread();
		virtual ~Thread();

		/**
		 * @param p_PtrThis pointer menuju objek This
		 * Fungsi ini merupakan entry point dari posix thread
		 */
		static void* Entry(void* p_PtrThis);
		
		/**
		 * Fungsi ini harus dioverride pada class anak
		 */
		virtual void Run();

		/**
		 * Fungsi ini harus dioverride pada class anak
		 */
		virtual void Execute() = 0;

		/**
		 * Fungsi ini harus dipanggil untuk menjalankan thread
		 */
		void Start();

		void Exit();
		
		/**
		 * @return keluaran dari thread yang dipanggil
		 * Memanggil fungsi ini akan memblock hingga thread ini mati
		 */
		int Join();
	};

}
